//muduo 库是基于主从Reactor 模型的高性能服务器
#include<muduo/net/TcpServer.h>
#include<muduo/net/EventLoop.h>
#include<muduo/net/TcpConnection.h>
#include<iostream>
#include<functional>
#include<unordered_map>

class TranslateServer
{
private:
    //_baseloop 为监听套接字,其中包含了epoll，会对事件进行监控
    muduo::net::EventLoop _baseloop;
    muduo::net::TcpServer _server;//主要用于设置回调函数，告诉服务器什么事件就绪应该去调用什么函数
private:
    //连接建立成功、关闭的时候所调用的函数
    void OnConnection(const muduo::net::TcpConnectionPtr& conn)
    {
        //判断连接的状态
        if(conn->connected())//处于连接创建成功状态
        {
            std::cout << "连接创建成功" << std::endl;
        }
        else
        {
            std::cout << "连接关闭" << std::endl;
        }
    }
 
    //翻译  - 更加上层的处理，接收请求，处理，返回应答
    std::string translate(const std::string& str)
    {
        static std::unordered_map<std::string,std::string> dict_map ={
            {"hello" , "你好"},
            {"world" , "世界"},
            {"apple" , "苹果"},
            {"peach" , "桃子"}
        };
        //对于请求字符串进行查询
        auto it = dict_map.find(str);
        if(it == dict_map.end()) return "我不知道";
        return it->second;
    }

    void OnMessage(const muduo::net::TcpConnectionPtr& conn , muduo::net::Buffer* buf , muduo::Timestamp)
    {
        //接收到了数据该如何处理数据
        //1、从buf 中将数据取出来，以字符串的形式就需要调用函数 retrieveAllAsString
        std::string str = buf->retrieveAllAsString();
        //2、进行翻译
        std::string resp = translate(str);
        //3、向客户端发送应答
        conn->send(resp);
    }
public:
    //构造
    TranslateServer(int port)
    :_server(&_baseloop , muduo::net::InetAddress("0.0.0.0" , port) ,"TreadslateServer",muduo::net::TcpServer::kNoReusePort)
    {
        //设置_server 的回调函数
        _server.setMessageCallback(std::bind(&TranslateServer::OnMessage, this , std::placeholders::_1,std::placeholders::_2,std::placeholders::_3));
        _server.setConnectionCallback(std::bind(&TranslateServer::OnConnection , this , std::placeholders::_1));
    }
    //启动服务器
    void Start()
    {
        //开启事件监听
        _server.start();
        _baseloop.loop();//开启事件监控
    }
    ~TranslateServer(){}
};

int main()
{
    TranslateServer server(8888);
    server.Start();
    return 0;
}